
/**
 * 
 * 求字符串中所有整数的最小和
 * 
 * 题目描述

输入字符串s，输出s中包含所有整数的最小和。

说明：

字符串s，只包含 a-z A-Z ± ；
合法的整数包括

1） 正整数 一个或者多个0-9组成，如 0 2 3 002 102
2）负整数 负号 – 开头，数字部分由一个或者多个0-9组成，如 -0 -012 -23 -00023

输入描述
包含数字的字符串

输出描述
所有整数的最小和

用例
输入	bb1234aa
输出	10
说明	无
输入	bb12-34aa
输出	-31
说明	1+2+（-34） = -31
 * 
 */

import java.math.BigInteger;
import java.util.Scanner;

/**
  * 
  题目解析
本题看上去很难，其实想清楚三点那就很简单

正数字符串的最小值如何计算？比如1234的最小值是多少，那肯定是1+2+3+4，即每位都是一个独立数，且都是一个小于10的数，它们之和就是最小的。
负数字符串的最小值如何计算？比如-34，那肯定是整体当成一个负数时，最小。
正数负数混合字符串最小值如何计算？比如12-34，那肯定是正数部分12每位单独计算，负数部分当成整体
我的解题思路如下：

定义一个容器negative，用于存储负数的数字字符

定义一个标识isNegative，用来记录是否遇到负数，初始化为false，标识一开始没有遇到负数

遍历输入字符串s的每一个字符c

如果 c == '-'，则说明负数要开始了，因此更新isNegative = true
如果 c 是数字字符，则此时需要分情况讨论：
isNegative == false，则此时直接将c字符转成对应的数值合入结果，ans += parseInt(c)
isNegative == true，则说明c是负数的字符，此时应该将c加入缓存容器negative中
如果 c 是字母字母，若isNegative == true，则需要将negative容器中内容拼接，然后转化为负数合入结果，ans -= parseInt(negative.join(""))，完成后，将isNeagtive = false，并且清空negative容器。
需要注意的是，当c == '-'，也需要注意出现 “-34-40” 这种情况，即 c == '-'，也需要先判断isNegative == true，则需要将negative容器中内容拼接，然后转化为负数合入结果，ans -= parseInt(negative.join(""))，完成后，将isNeagtive = false，并且清空negative容器。

2023.06.01

本题没有说明数字长度，因此Java和JS需要使用大数处理。

2023.12.08

修复一个问题，比如用例

bb12-a-34aa
可能会出现不完整负数情况，即只有一个符号的情况，此时我们应该过滤掉这种不完整负数场景
  */
public class 求字符串中所有整数的最小和 {
    
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        System.out.println(getResult(sc.nextLine()));

    }

    public static String getResult(String s) {
        boolean isNegative = false;
        StringBuilder negative = new StringBuilder();
    
        //    int ans = 0;
        BigInteger ans = new BigInteger("0");
    
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
        
            if (c >= '0' && c <= '9') {
                if (isNegative) {
                    negative.append(c);
                } else {
                    //          ans += Integer.parseInt(c + "");
                    ans = ans.add(new BigInteger(c + ""));
                }
            } else {
                if (isNegative && negative.length() > 0) {
                    //          ans -= Integer.parseInt(negative.toString());
                    ans = ans.subtract(new BigInteger(negative.toString()));
                    negative = new StringBuilder();
                }
        
                isNegative = c == '-';
            }
        }
    
        if (negative.length() > 0) {
            //      ans -= Integer.parseInt(negative.toString());
            ans = ans.subtract(new BigInteger(negative.toString()));
        }
    
        return ans.toString();
  }

}
